package cc

import (
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"github.com/go-playground/validator/v10"
	"learn/app/request/cr"
	"sync"
)

var validate *validator.Validate
var validateOnce sync.Once

func init() {
	validateOnce.Do(func() {
		validate = validator.New()
		validate.SetTagName("check")
		cr.InitValidate(validate)                          // 注册自定义方法
		validate.RegisterTagNameFunc(cr.CustomTagNameFunc) // 注册用 label 做中文名 处理这个方法。可以做多语言
	})
}

func BindParamAndCheckAndExpectField(c *gin.Context, obj interface{}, filed ...string) bool {

	if c.Request.Method == "POST" {
		if err := c.ShouldBindBodyWith(obj, binding.JSON); err != nil {
			Return_fail(c, WithMsg("请求解析错误，请确认请求格式是否正确。上传文件请使用 multipart 标头，参数请使用 JSON 格式。"))
			return false
		}
	} else if c.Request.Method == "GET" {
		if err := c.ShouldBindQuery(obj); err != nil {
			Return_fail(c, WithMsg("请求解析错误，请确认请求格式是否正确。上传文件请使用 multipart 标头，参数请使用 JSON 格式。"))
			return false
		}
	} else {
		Return_fail(c, WithMsg("请求解析错误，请确认请求格式是否正确。上传文件请使用 multipart 标头，参数请使用 JSON 格式。"))
		return false
	}

	// --------------------------------------------------------------------------
	trans := cr.InitLang(validate)
	//validate.RegisterAlias()
	err := validate.StructExcept(obj, filed...)
	if err != nil {
		Return_fail(c, WithMsg(err.(validator.ValidationErrors)[0].Translate(trans))) // 返回第一个错误
		return false
	}
	return true

}
